package jsp;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/4/12 11:02
 * Version:1.0-SNAPSHOT
 * Description: 通过一个Servlet配置访问WEB-INF下多个jsp资源的命令
 */
@WebServlet("/show/*")
public class ShowServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        response.sendRedirect(request.getContextPath()+"/WEB-INF/test01.jsp");
//        request.getRequestDispatcher("/WEB-INF/test01.jsp").forward(request,response);

        // 由于在WEB-INF下的资源存在很多
        // 但是这些资源有一个共同点
        // 它们的前缀始终是/WEB-INF,它们的后缀始终是.jsp
        // 变化的是中间内容
        // 中间的内容看上去就是一个访问命令
        // 我们可以通过通配符的方式与这些访问命令联系在一起
        // 此时配置的是/show/*
        // 可以通过命令/show/test01表示访问/WEB-INF/test01.jsp
        // 可以通过命令/show/pages/test02表示访问/WEB-INF/pages/test02.jsp
        // 如何获取到具体的访问命令
        String servletPath = request.getServletPath();
        System.out.println("servletPath:"+servletPath);
        // 没有具体的方法能够获取到想要的/test01
        // 但是可以获取完整的uri地址

        String uri = request.getRequestURI();
        System.out.println("uri:"+uri);

        String contextPath = request.getContextPath();
        System.out.println("contextPath:"+contextPath);
        // 此时能够获取到与之关联的三个字符串
        // 而我们想要的是/test01,但是字符串只有拼接没有减的用法
        // "/web/show/test01"-"/web"-"/show"="/test01";
        // 可以通过其他方式实现类似于减的用法,截取字符串
        // 只需要通过uri实现截取字符串
        // 从contextPath+servletPath获取的字符串长度开始截取,一直截取到末尾即可
        String path = uri.substring((contextPath+servletPath).length());
        System.out.println("path:"+path);

        System.out.println("/WEB-INF"+path+".jsp");
        // 最终实际需要访问的页面即为当前获取的path加上指定的前缀/WEB-INF与指定的后缀.jsp
        request.getRequestDispatcher("/WEB-INF"+path+".jsp").forward(request,response);
    }

}
